package com.factory;

import com.utils.JDBCUtil;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;

public class OfficeFactory {
    // 通用的Dao工厂类，通用的增删改查方法
    // String sql = "insert into user values (?,?,?)";
    // 1、增删改通用的方法(Sql语句从外面传进来，SQL中包含的值也是外面传进来的)
    public static Boolean update(String sql, java.lang.Object...args) {
        Connection conn = null;
        PreparedStatement pst = null;
        try {
            conn = JDBCUtil.getConnection();
            pst = conn.prepareStatement(sql);
            for (int i = 1 ; i <= args.length ; i++) {
                pst.setObject(i, args[i-1]);
                // 占位符是从1开始，数组下标是从0开始
            }
            int i = pst.executeUpdate();
            return i > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            JDBCUtil.close(conn, pst, null);
        }
    }

    // 2、查询通用的方法（查某个类）User类
    // （1、查询条件不确定， 2、查询结果不确定）
    public static <T> ArrayList< T > select(Object obj, String sql, Object...args) {
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet res = null;
        try {
            conn = JDBCUtil.getConnection();
            pst = conn.prepareStatement(sql);
            // 用来解决查询条件不确定的情况(使用长度不固定的数组)
            for (int i = 1 ; i <= args.length ; i++) {
                pst.setObject(i, args[i-1]);
                // 占位符是从1开始，数组下标是从0开始
            }
            res = pst.executeQuery(); // res 是存放查询结果的数据
            // 查询结果存入res对象中，需要对res进行处理
            ArrayList<T> arr = new ArrayList<>();
            while(res.next()) {
                obj = obj.getClass().newInstance();
                // 不确定查询出来的列数、列名、列值
                // ResultSetMetaData用来存放结果的一些相关数据信息
                ResultSetMetaData rsmd = res.getMetaData();
                int columnCount = rsmd.getColumnCount(); // 用来获取查询结果的列数
                for(int i = 1 ; i <= columnCount ; i++) {
                    // 获取列名
                    String columnName = rsmd.getColumnName(i);
                    // 获取列值
                    Object columnValue = res.getObject(i);
                    // 将获取到的列值和列名进行匹配
                    Field field = obj.getClass().getDeclaredField(columnName.replaceAll(" ",""));
                    field.setAccessible(true); // 打开通道
                    field.set(obj, columnValue);
                }
                arr.add((T) obj);
            }
            return arr;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn, pst, res);
        }
        // 默认是返回空，如果有查询结果，再来处理查询结果并返回
        return null;
    }
}
